package cn.fz.eventdemo01.listener;

import cn.fz.eventdemo01.event.LoginEvent;
import org.springframework.context.event.EventListener;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

/**
 * 特性
 * 事件驱动
 *
 * 基于事件驱动的机制，它允许组件在特定事件发生时被通知并响应。
 *
 * 解耦
 * 帮助在应用内不同组件之间实现解耦。发布事件的组件不需要了解事件的具体监听者，监听者只需要订阅感兴趣的事件即可。
 *
 * 同步处理和异步处理
 * 支持同步或异步方式处理事件，通过@Async注解或配置异步事件处理器。
 * 即没有配置异步的情况下，由当前线程同步处理事件。
 *
 * 使用建议
 * 适用于内部组件之间的通信和解耦，本身不提供强制的可靠性保证机制，可靠性通常由应用开发者来保证。常用于用户注册事件、库存更新事件等轻量级事件的处理。
 * 而消息队列更适用于跨应用、跨服务、分布式系统以及异步处理、或者高并发场景，同时提供了一些现成的可靠性方案供我们选择。
 *
 * 监听器异步实现 @Async
 * 默认使用同步处理的方式，若需实现监听器异步处理我们可以结合 @EnableAsync 注解使用，我们将上文的 LoginEventPrintLogListener 使用异步线程处理：
 * 需要在启动类中添加 @EnableAsync 注解
 * 链接：https://juejin.cn/post/7289717829733941307
 */
@Component
public class LoginEventPrintLogListener implements LoginEventListener {
    // 配置任务异步
    @Async
    @EventListener
    @Order(2)
    @Override
    public void handleUserLoginEvent(LoginEvent loginEvent){
        // 在这里执行处理用户登录事件的逻辑，例如记录日志或触发其他操作
        System.out.println("用户：" + loginEvent.getUserName() + " 登录了");
    }
}
